package com.ruoyi.pos.domain.cashier;

import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
import java.util.Date;

/**
 * POS收银员实体类
 * 
 * 独立的收银员管理，不与框架用户绑定
 * 支持多款台号和多柜组绑定
 * 
 * @author POS System
 * @since 1.0.0
 */
@Data
@EqualsAndHashCode(callSuper = true)
public class PosCashier extends BaseEntity {
    
    private static final long serialVersionUID = 1L;

    /**
     * 收银员ID（主键）
     */
    private Long cashierId;

    /**
     * 收银员编号
     */
    @Excel(name = "收银员编号")
    @NotBlank(message = "收银员编号不能为空")
    @Size(max = 20, message = "收银员编号长度不能超过20个字符")
    private String cashierCode;

    /**
     * 收银员姓名
     */
    @Excel(name = "收银员姓名")
    @NotBlank(message = "收银员姓名不能为空")
    @Size(max = 50, message = "收银员姓名长度不能超过50个字符")
    private String cashierName;

    /**
     * 收银员昵称
     */
    @Excel(name = "收银员昵称")
    @Size(max = 50, message = "收银员昵称长度不能超过50个字符")
    private String nickName;

    /**
     * 手机号码
     */
    @Excel(name = "手机号码")
    @Size(max = 20, message = "手机号码长度不能超过20个字符")
    private String phoneNumber;

    /**
     * 邮箱
     */
    @Excel(name = "邮箱")
    @Size(max = 100, message = "邮箱长度不能超过100个字符")
    private String email;

    /**
     * 登录密码（加密存储）
     */
    private String password;

    /**
     * 头像路径
     */
    @Excel(name = "头像")
    @Size(max = 200, message = "头像路径长度不能超过200个字符")
    private String avatar;

    /**
     * 收银员状态（0正常 1停用）
     */
    @Excel(name = "收银员状态", readConverterExp = "0=正常,1=停用")
    private String status;

    /**
     * 是否在线（0离线 1在线）
     */
    @Excel(name = "是否在线", readConverterExp = "0=离线,1=在线")
    private String isOnline;

    /**
     * 当前登录设备编码
     */
    @Excel(name = "当前设备")
    @Size(max = 50, message = "设备编码长度不能超过50个字符")
    private String currentDeviceCode;

    /**
     * 最后登录时间
     */
    @Excel(name = "最后登录时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
    private Date lastLoginTime;

    /**
     * 最后登录IP
     */
    @Excel(name = "最后登录IP")
    @Size(max = 50, message = "IP地址长度不能超过50个字符")
    private String lastLoginIp;

    /**
     * 密码最后更新时间
     */
    private Date pwdUpdateDate;

    /**
     * 是否首次登录（0否 1是）
     */
    private String isFirstLogin;

    /**
     * 登录失败次数
     */
    private Integer loginFailCount;

    /**
     * 账户锁定时间
     */
    private Date lockTime;

    /**
     * 排序号
     */
    @Excel(name = "排序号")
    private Integer sortOrder;

    /**
     * 是否启用(0否 1是)
     */
    @Excel(name = "是否启用", readConverterExp = "0=否,1=是")
    private String isEnabled;

    /**
     * 备注
     */
    @Excel(name = "备注")
    @Size(max = 500, message = "备注长度不能超过500个字符")
    private String remark;

    // ==================== 业务方法 ====================

    /**
     * 判断收银员是否可用
     */
    public boolean isAvailable() {
        return "0".equals(this.status) && "1".equals(this.isEnabled);
    }

    /**
     * 判断收银员是否在线
     */
    public boolean isOnline() {
        return "1".equals(this.isOnline);
    }

    /**
     * 判断账户是否被锁定
     */
    public boolean isLocked() {
        return this.lockTime != null && this.lockTime.after(new Date());
    }

    /**
     * 判断是否首次登录
     */
    public boolean isFirstLogin() {
        return "1".equals(this.isFirstLogin);
    }

    /**
     * 获取显示名称（优先显示昵称）
     */
    public String getDisplayName() {
        return this.nickName != null && !this.nickName.trim().isEmpty() 
            ? this.nickName : this.cashierName;
    }

    /**
     * 重置登录失败次数
     */
    public void resetLoginFailCount() {
        this.loginFailCount = 0;
        this.lockTime = null;
    }

    /**
     * 增加登录失败次数
     */
    public void incrementLoginFailCount() {
        this.loginFailCount = this.loginFailCount == null ? 1 : this.loginFailCount + 1;
    }

    // ==================== 备用扩展字段 ====================
    
    /**
     * 备用字段1
     */
    private String reserved1;

    /**
     * 备用字段2
     */
    private String reserved2;

    /**
     * 备用字段3
     */
    private String reserved3;

    /**
     * 备用字段4
     */
    private String reserved4;

    /**
     * 备用字段5
     */
    private String reserved5;
}
